템플릿 메서드 패턴
AI
gemma-4-31b
템플릿 메서드 패턴 (Template Method Pattern)
템플릿 메서드 패턴은 알고리즘의 골격을 상위 클래스에 정의하고, 일부 단계의 구체적인 구현은 하위 클래스에서 담당하도록 하는 행동 디자인 패턴입니다. 이를 통해 전체적인 알고리즘 구조는 유지하면서, 특정 단계의 동작만 하위 클래스에서 유연하게 변경할 수 있습니다.
핵심 개념
템플릿 메서드 패턴은 역할 분담을 통해 코드의 재사용성과 일관성을 확보합니다.
- 추상 클래스 (Abstract Class): 알고리즘의 전체적인 흐름을 정의하는 '템플릿 메서드'를 포함합니다. 공통적으로 사용되는 로직은 직접 구현하고, 하위 클래스에서 구현해야 할 단계는 추상 메서드로 선언합니다.
- 구체 클래스 (Concrete Class): 추상 클래스에서 정의한 추상 메서드를 실제로 구현하여, 알고리즘의 세부 단계를 완성합니다.
불변의 단계와 가변의 단계
- 불변의 단계 (Invariant steps): 모든 하위 클래스에서 동일하게 작동해야 하는 로직입니다. 상위 클래스에서
final메서드(Java 기준) 등으로 구현하여 하위 클래스가 변경하지 못하도록 강제합니다. - 가변의 단계 (Variant steps): 하위 클래스에 따라 다르게 구현되어야 하는 로직입니다. 추상 메서드나 훅(Hook) 메서드로 정의하여 하위 클래스가 오버라이딩할 수 있게 합니다.
구조 및 예시 코드
구조도
- AbstractClass: 템플릿 메서드를 정의하며, 가변 단계에 해당하는 추상 메서드를 선언합니다.
- ConcreteClass:
AbstractClass를 상속받아 추상 메서드를 구체적으로 구현합니다.
구현 예시 (Java)
// 추상 클래스: 알고리즘의 골격을 정의
abstract class CaffeineBeverage {
// 템플릿 메서드: 알고리즘의 구조를 정의 (final로 선언하여 변경 방지)
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 불변의 단계: 모든 음료에 공통 적용
void boilWater() {
System.out.println("물을 끓입니다.");
}
void pourInCup() {
System.out.println("컵에 따릅니다.");
}
// 가변의 단계: 하위 클래스에서 구현
abstract void brew();
abstract void addCondiments();
}
// 구체 클래스 1: 커피
class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("필터를 통해 커피를 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("설탕과 우유를 추가합니다.");
}
}
// 구체 클래스 2: 차(Tea)
class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("찻잎을 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("레몬을 추가합니다.");
}
}
장단점 분석
장점
- 코드 중복 제거: 공통 로직을 상위 클래스에 집중시켜 코드 중복을 최소화합니다.
- 알고리즘 구조 강제화: 전체적인 실행 순서를 상위 클래스에서 제어하므로, 하위 클래스에서 임의로 순서를 변경하는 것을 방지할 수 있습니다.
- 확장성: 새로운 구체 클래스를 추가함으로써 기존 알고리즘의 세부 단계만 쉽게 확장할 수 있습니다.
단점
- 강한 결합: 상속을 기반으로 하므로 상위 클래스와 하위 클래스 간의 결합도가 높습니다.
- 유연성 제한: 알고리즘의 골격이 고정되어 있어, 하위 클래스에서 전체적인 흐름을 변경해야 할 경우 대응하기 어렵습니다.
- 클래스 수 증가: 단계별 구현을 위해 많은 수의 하위 클래스가 생성될 수 있습니다.
전략 패턴과의 비교
템플릿 메서드 패턴과 전략 패턴은 모두 알고리즘을 캡슐화한다는 점에서 유사하지만, 구현 방식에서 큰 차이가 있습니다.
| 구분 | 템플릿 메서드 패턴 (Template Method) | 전략 패턴 (Strategy) |
|---|---|---|
| 핵심 메커니즘 | 상속 (Inheritance) | 합성 (Composition) |
| 결정 시점 | 컴파일 타임에 결정 (정적) | 런타임에 결정 (동적) |
| 제어 방식 | 상위 클래스가 흐름을 제어 (Hollywood Principle) | 클라이언트가 전략 객체를 선택하여 주입 |
| 변경 범위 | 알고리즘의 일부 단계를 변경 | 알고리즘 전체를 교체 |
AI 생성 콘텐츠 안내
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.